<?php

/**
 * Description of Site
 * Definições e funções para usar em todas as paginas.
 * @author lmcosta
 */
class Site {

    //Dados do Site
    var $path;
    
    //Configurações de segurança (para encriptação de password e id de sessão)
    var $pass_key;
    var $id_key;
    var $sessionTimeout;
    
    //Dados da Base dados
    var $db_host;
    var $db_user;
    var $db_pass;
    var $db_name;
    var $ligacao_db;
    
    //Definir login para usar https
    var $https;
    
    // Uma única instancia da classe Session
    private static $instance;
    
    private function __construct() {
        //Dados por defeito
        $this->path = "/PS-TP3";
        $this->https = false;
        
        $this->pass_key = '?Eh6u.nsO{K6J9qP%|(2p}a@=^/0r';
        $this->id_key = '|^i@+|^/>v<5Hu&J&\S1)#MjQrHQo';
        $this->sessionTimeout = 600; //600 segundos = 10 minutos
    }

    /**
     *    Devolve a instancia do Site
     *    @return    object
     **/
    public static function getInstance() {
        if (!isset(self::$instance)) {
            self::$instance = new self;
        }

        //Iniciar a sessão
        if (!isset($_SESSION)) {
            session_start();
        }

        //criar token para os forms
        self::$instance->gerarToken();

        return self::$instance;
    }

    function InitDB($host, $username, $password, $name) {
        $this->db_host = $host;
        $this->db_user = $username;
        $this->db_pass = $password;
        $this->db_name = $name;
    }

    function setPath($path) {
        $this->path = $path;
    }
    
    function setHttps($https) {
        $this->https = $https;
    }
    
    function setSessionTimeout($time) {
        $this->sessionTimeout = $time;
    }
    
    function setPassKey($key) {
        $this->pass_key = $key;
    }
    
    function setIdKey($key) {
        $this->id_key = $key;
    }

    /**
     * Redirecionar para outro url
     * @param string $url - Url a redirecionar
     * @param boolean $relative - true: url relativo ; false: url absoluto
     */
    function redirectTo($url, $relative = true) {
        $redirect = $url;
        $path = "";
        if($relative) {
            $path = $this->path;
        }
        if ($this->https) {
            $redirect = "https://" . $_SERVER['HTTP_HOST'] . $path . $url;
        } else {
            $redirect = "http://" . $_SERVER['HTTP_HOST'] . $path . $url;
        }
        header("Location: $redirect");
        exit();
    }

    /**
     * Gerar Token a ser usado nos formulários na sessão actual 
     * @return string 
     */
    function gerarToken() {
        if (!isset($_SESSION['csrf_token'])) {
            $csrf_token = strtoupper(md5(uniqid(rand(), true)));
            $csrf_token = substr($csrf_token, 0, 8) . '-' .
                    substr($csrf_token, 8, 4) . '-' .
                    substr($csrf_token, 12, 4) . '-' .
                    substr($csrf_token, 16, 4) . '-' .
                    substr($csrf_token, 20);

            $_SESSION['csrf_token'] = $csrf_token;
        }
        return $_SESSION['csrf_token'];
    }
    
    /**
     * Efectuar ligação à base de dados
     * As mensagens de erro são passadas para o parametro msg
     * @param string $msg - variavel para guardar os eventuais erros
     * @return boolean 
     */
    function ligarDB(&$msg) {

        $this->ligacao_db = mysql_connect($this->db_host, $this->db_user, $this->db_pass);

        if (!$this->ligacao_db) {
            $msg = "Erro ao ligar à base dados! Confirmar se os dados da base dados estão correctos\r\n";
            return false;
        }
        if (!mysql_select_db($this->db_name, $this->ligacao_db)) {
            $msg = "Erro ao selecionar a base dados: " . $this->db_name . " Confirmar se os dados estão correctos\r\n";
            return false;
        }

        return true;
    }

    /**
     * Fechar a ligação à base de dados 
     */
    function closeDB() {
        if (isset($this->ligacao_db)) {
            mysql_close($this->ligacao_db);
        }
    }

}

?>
